package com.yunyao.dao.service.act.impl;

import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.yunyao.dao.mapper.ActHiTaskinstMapper;
import com.yunyao.dao.model.ActHiTaskinst;
import com.yunyao.dao.service.act.IActHiTaskinstService;
import org.apache.commons.lang3.StringUtils;
import org.springframework.stereotype.Service;

import java.util.Date;
import java.util.List;

/**
 * <p>
 *  服务实现类
 * </p>
 *
 * @author xingjishuai
 * @since 2024-07-02
 */
@Service
public class ActHiTaskinstServiceImpl extends ServiceImpl<ActHiTaskinstMapper, ActHiTaskinst> implements IActHiTaskinstService {

    /**
     * 根据流程实例ID查询历史任务实例列表
     *
     * @param processInstanceId 流程实例ID
     * @return 历史任务实例列表如果流程实例ID为空或无效，返回空列表
     */
    @Override
    public List<ActHiTaskinst> listByProcessInstanceId(String processInstanceId) {
        // 检查流程实例ID是否为空或空白，如果是，则直接返回空列表
        if (StringUtils.isBlank(processInstanceId)) {
            return List.of();
        }

        // 构建查询条件，用于精确匹配流程实例ID
        LambdaQueryWrapper<ActHiTaskinst> wrapper =
                new LambdaQueryWrapper<ActHiTaskinst>()
                        .eq(ActHiTaskinst::getProcInstId, processInstanceId);

        // 执行查询并返回结果
        return list(wrapper);
    }

    /**
     * 根据流程实例ID、任务定义键、任务ID和用户ID更新任务信息
     *
     * @param processInstanceId 流程实例ID
     * @param taskDefKey 任务定义键
     * @param taskId 任务ID
     * @param userId 用户ID
     */
    @Override
    public void updateInfoByProcInstIdAndTaskDefKey(String processInstanceId, String taskDefKey,
                                                    String taskId, String userId) {
        // 创建查询包装器，用于查询历史任务实例
        LambdaQueryWrapper<ActHiTaskinst> wrapper =
                new LambdaQueryWrapper<ActHiTaskinst>()
                        .eq(ActHiTaskinst::getProcInstId, processInstanceId)
                        .eq(ActHiTaskinst::getTaskDefKey, taskDefKey)
                        .eq(ActHiTaskinst::getId, taskId);

        // 根据查询条件获取历史任务实例
        ActHiTaskinst actHiTaskinst = getOne(wrapper);

        // 更新任务的结束时间
        actHiTaskinst.setEndTime(new Date());
        // 更新任务的认领时间
        actHiTaskinst.setClaimTime(new Date());
        // 更新任务的最后更新时间
        actHiTaskinst.setLastUpdatedTime(new Date());
        // 更新任务的到期时间
        actHiTaskinst.setDueDate(new Date());

        // 计算并更新任务的持续时间
        actHiTaskinst.setDuration(actHiTaskinst.getEndTime().getTime() - actHiTaskinst.getStartTime().getTime());

        // 更新任务的负责人
        actHiTaskinst.setAssignee(userId);

        // 更新数据库中的任务信息
        updateById(actHiTaskinst);
    }
}
